﻿// CMakeMap.cpp: 定义应用程序的入口点。
//

#include "CMakeMap.h"
#include <map>

using namespace std;

class student
{
public:
	int id;
	string name;
	 
	void Student()
	{ }
	

	void Student(int id, string name)
	{
		this->id = id;
		this->name = name;
	}
};

int main()
{
	// 构造一个map容器对象，存储student对象
	map<int, student> stud;
	map<int, string> studMap;
	// 插入方式1
	studMap.insert(pair<int, string>(1, "asd"));  // 注意pair对象要带类型
	studMap.insert(pair<int, string>(2, "小众"));
	studMap.insert(pair<int, string>(3, "奥发霉了"));
#if 0
	int id = 33;
	string name = "asfd";
	pair<int, string> p(id, name);  // 外部直接构造一个pair对象也可以
	studMap.insert(p);
#endif

	// 插入方式2
	studMap.insert(map<int, string>::value_type(4, "奥发霉了"));  // map<int, string>::作用于操作符  value_type是对象
	map<int, string>::value_type v(55, "shfdoi1");
	studMap.insert(v);

	studMap.insert(map<int, string>::value_type(4, "奥发霉了231"));  // 这个时候是不会覆盖的 相对来说是安全的

	// 插入方式3
	// 该方法有两种作用 1.插入 2.删除  如果键存在的话就修改 不存在就插入
	// 修改的方式为先删除后插入
	studMap[6] = "ahfodoo";
	studMap[6] = "ahfodoo是 hrdjyghfkjg";  // 用类似于数组方式会覆盖

	// 插入一个对象
	student stu1(111, "shfdo");
	stud.insert(pair<int, student>(stu1.id, stu1));

	student stu2(112, "shfdsf");
	stud.insert(map<int, student>::value_type(stu2.id, stu2));

	student stu3(113, "sxhofg");
	stud[stu3.id] = stu3;


	map<int, string>::iterator it;
	for (it = studMap.begin();it != studMap.end();it++)
	{
		//pair<int, string> p = *it;
		//cout << "studMap[" << p.first << "]=" << p.second << endl;
		cout << "studMap[" << it->first << "]=" << it->second << endl;
	}

	map<int, student>::iterator it2;
	for (it2 = stud.begin();it2 != stud.end();it2++)
	{
		cout << "stud[" << it2->first << "]=" << it2->second.name << endl;      // 注意这里直接cout不出对象，如果要输出则要重载cout<<
	}

	/*查找*/
	// 获取学号为3的名字
	string stu_name = studMap[3];
	cout << stu_name << endl;

	map<int, string>::iterator it3;
	it3= studMap.find(10);
	if(it3!=studMap.end())   // 不能确保能找到
	{ 
		cout << "studMap[10]=" << it3->second << endl;
	}
	else
	{
		cout << "can not find key=10" << endl;
	}
	stu_name = studMap[10];  //  如果容器中不存在10的键值对，则创建一个并且默认值为""
	cout << "studMap[10]=" << stu_name << endl;


	it3 = studMap.find(3);
	if (it3 != studMap.end())
	{
		//cout << "studMap[3]=" << it3->second << endl;
		cout << "studMap[3]=" << (*it3).second << endl;
	}
	else
	{
		cout << "can not find key=3" << endl;
	}

	cout << "studMap[3]=" << studMap.at(23)<< endl;  // at也可以使用，但是对于不存在的键会抛出错误:out of range  推荐使用find
	return 0;
}
